import 'package:flutter/foundation.dart';
import '../../../../common/result.dart';
import '../../domain/order_item.dart';
import '../../domain/repositories/order_repository.dart';

/// `OrderNotifier` 负责管理订单功能的状态。
///
/// 这个 Notifier 负责获取并持有订单列表。
/// 它使用 `ChangeNotifier` 来通知其监听者（通常是UI组件）状态发生了变化。
/// 它使用一个 `Result` 类型来表示数据获取过程的当前状态（成功、失败或加载中）。
///
/// - **设计模式**: 这是一个典型的 `ViewModel` 或 `Controller`，在MVVM或MVC架构中，
///   它作为UI和数据层之间的桥梁。
/// - **依赖注入**: 它被设计为与依赖注入框架（如 `provider`）一起使用，
///   以便将 `OrderNotifier` 实例提供给Widget树。
///
/// **用法示例**:
/// ```dart
/// ChangeNotifierProvider(
///   create: (context) => OrderNotifier(context.read<OrderRepository>()),
///   child: YourWidget(),
/// )
/// ```
class OrderNotifier extends ChangeNotifier {
  final OrderRepository _repository;

  // 初始状态设为成功，但列表为空。
  Result<List<OrderItem>> _orderResult = Result.success([]);

  /// 创建一个 `OrderNotifier` 实例。
  ///
  /// 需要一个 `OrderRepository` 来获取订单数据。
  OrderNotifier(this._repository);

  /// 订单加载过程的当前结果。
  /// UI层可以根据这个结果来显示不同的状态（加载中、成功、失败）。
  Result<List<OrderItem>> get orderResult => _orderResult;

  /// 如果最后一次 `loadOrders` 调用失败，则返回错误信息，否则为 `null`。
  Object? get error => _orderResult.error;

  /// 从存储库获取订单历史记录。
  ///
  /// 开始时将状态设置为加载中，完成后设置为成功或失败状态。
  /// 每次状态更改后都会通知监听者。
  Future<void> loadOrders() async {
    try {
      // 使用 Result 模式时，可以不显式设置加载状态，
      // 因为UI可以根据 Future 的状态来显示加载指示器。
      // 如果需要，也可以在这里添加一个 _orderResult = Result.loading();
      final orders = await _repository.getOrderHistory();
      _orderResult = Result.success(orders);
    } catch (e) {
      _orderResult = Result.failure(e);
    } finally {
      // 确保在操作完成后通知监听者，以便UI可以更新。
      notifyListeners();
    }
  }

  /// 从存储库重新加载订单。
  ///
  /// 这是一个方便的方法，只是简单地调用 `loadOrders`。
  /// 可用于实现“下拉刷新”功能。
  Future<void> refreshOrders() => loadOrders();
}